// 防抖： 是一种防止代码被频繁执行的思想
// 防抖函数： 是结合延迟函数封装的一个自定义函数 （事件被频繁触发时，会重新执行延迟函数，时间会被重新计算）
// 参数：1.回调函数，2.时间，3.布尔值
// 定义函数
function debounce(callback, times, bool) { // 作用域1
    // 记录延迟函数的变量
    var delay = null;
    // 记录布尔值
    var firstFlag = bool;
    // 返回函数（产生闭包）
    return function () { // 作用域2
        // 判断delay变量是否有值 ，如果有值，说明延迟函数正在执行
        // 事件如果再次触发，就会清除延迟函数，后续会重新开始执行延迟函数
        if (delay) clearTimeout(delay);
        // 不放形参占位置的时候，有什么方方式获取实参的数据（arguments对象）
        // 记录事件函数作用域的事件对象
        var args = arguments[0];
        // 在延迟函数作用域外 记录this
        var _this = this;
        // 判断布尔值是否为true , 如果是，首次不需要延迟调用回调函数
        if (firstFlag) {
            // 判断callback是否为函数
            if (typeof callback == "function") {
                // 调用函数
                // callback(args);
                callback.apply(_this, [args]);
            }
            // 布尔值设置false
            firstFlag = false;
        }
        // 执行延迟函数
        delay = window.setTimeout(function () {// 作用域 3
            // 清除延迟函数
            clearTimeout(delay);
            delay = null;
            // 判断callback是否为函数
            if (typeof callback == "function") {
                // 调用函数
                // callback(args);
                // call apply bind 用改变作用域this指向
                callback.apply(_this, [args]);
            }
        }, times);
    }
}